//package com.example.demo.service;
//
//import io.milvus.client.MilvusServiceClient;
//import io.milvus.grpc.DataType;
//import io.milvus.grpc.MutationResult;
//import io.milvus.grpc.SearchResults;
//import io.milvus.param.*;
//import io.milvus.param.collection.CreateCollectionParam;
//import io.milvus.param.collection.FieldType;
//import io.milvus.param.collection.HasCollectionParam;
//import io.milvus.param.dml.InsertParam;
//import io.milvus.param.dml.SearchParam;
//import io.milvus.param.index.CreateIndexParam;
//import io.milvus.response.SearchResultsWrapper;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.PreDestroy;
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.List;
//
///**
// * 说明：
// * // Milvus 向量数据库操作服务类
// * 注释以中文为主，解释了每个方法、关键变量以及重要逻辑的作用。
// * 对 Milvus 的操作如创建集合、索引、插入向量、搜索相似向量等都有清晰说明。
// * 适用于代码维护、团队协作与后续功能扩展时理解代码逻辑。
// */
//
//@Service
//public class MilvusService {
//    private static final Logger logger = LoggerFactory.getLogger(MilvusService.class);
//
//    private MilvusServiceClient milvusClient; // Milvus 客户端
//
//    @Value("${milvus.host}")
//    private String host; // Milvus 服务主机地址
//
//    @Value("${milvus.port}")
//    private int port; // Milvus 服务端口
//
//    @Value("${milvus.collection.name}")
//    private String collectionName; // Milvus 集合名称
//
//    private static final int VECTOR_DIM = 128; // 向量的维度为128维
//
//    // Spring Bean 初始化完成后调用，用于初始化 Milvus 连接和集合
//    @PostConstruct
//    public void init() {
//        // 构建 Milvus 连接参数
//        ConnectParam connectParam = ConnectParam.newBuilder().withHost(host).withPort(port).withAuthorization("root","Milvus").build();
//
//        milvusClient = new MilvusServiceClient(connectParam);
//
//        // 检查指定集合是否存在
//        HasCollectionParam hasCollectionParam = HasCollectionParam.newBuilder().withCollectionName(collectionName).build();
//
//        R<Boolean> hasCollectionResponse = milvusClient.hasCollection(hasCollectionParam);
//
//        // 如果集合不存在，则创建集合和索引
//        if (hasCollectionResponse.getData().equals(Boolean.FALSE)) {
//            createCollection();
//            createIndex();
//            logger.info("Collection {} created successfully", collectionName);
//        } else {
//            logger.info("Collection {} already exists", collectionName);
//        }
//    }
//
//    // 创建 Milvus 集合（数据表）
//    private void createCollection() {
//        // 定义主键字段 id，类型为 Int64，设为主键并自动生成
//        FieldType idField = FieldType.newBuilder().withName("id").withDataType(DataType.Int64).withPrimaryKey(true).withAutoID(true).build();
//
//        // 定义用户ID字段，类型为 Int64
//        FieldType userIdField = FieldType.newBuilder().withName("user_id").withDataType(DataType.Int64).build();
//
//        // 定义向量字段，类型为 FloatVector，维度为 VECTOR_DIM
//        FieldType vectorField = FieldType.newBuilder().withName("vector").withDataType(DataType.FloatVector).withDimension(VECTOR_DIM).build();
//
//        // 构建创建集合的参数
//        CreateCollectionParam createCollectionParam = CreateCollectionParam.newBuilder().withCollectionName(collectionName).withDescription("Collection for vector embeddings").addFieldType(idField).addFieldType(userIdField).addFieldType(vectorField).build();
//
//        // 执行创建集合操作
//        R<RpcStatus> response = milvusClient.createCollection(createCollectionParam);
//        if (response.getStatus() != R.Status.Success.getCode()) {
//            logger.error("Failed to create collection: {}", response.getMessage());
//            throw new RuntimeException("Failed to create collection: " + response.getMessage());
//        }
//    }
//
//    // 在集合上创建向量索引，用于加速相似度搜索
//    private void createIndex() {
//        final IndexType INDEX_TYPE = IndexType.IVF_FLAT; // 使用 IVF_FLAT 索引类型
//        final String INDEX_PARAM = "{\"nlist\":1024}"; // 索引参数，nlist 为聚类中心数
//
//        CreateIndexParam createIndexParam = CreateIndexParam.newBuilder().withCollectionName(collectionName).withFieldName("vector") // 索引字段为 vector
//                .withIndexType(INDEX_TYPE).withMetricType(MetricType.L2) // 使用 L2 距离度量
//                .withExtraParam(INDEX_PARAM).withSyncMode(Boolean.TRUE) // 同步创建索引
//                .build();
//
//        R<RpcStatus> response = milvusClient.createIndex(createIndexParam);
//        if (response.getStatus() != R.Status.Success.getCode()) {
//            logger.error("Failed to create index: {}", response.getMessage());
//            throw new RuntimeException("Failed to create index: " + response.getMessage());
//        }
//    }
//
//    // 向 Milvus 集合中插入一条向量数据，包含用户ID和向量
//    public void insertVector(Long userId, List<Float> vector) {
//        List<InsertParam.Field> fields = new ArrayList<>();
//        // 添加 user_id 字段数据
//        fields.add(new InsertParam.Field("user_id", Collections.singletonList(userId)));
//        // 添加 vector 字段数据
//        fields.add(new InsertParam.Field("vector", Collections.singletonList(vector)));
//
//        // 构建插入参数
//        InsertParam insertParam = InsertParam.newBuilder().withCollectionName(collectionName).withFields(fields).build();
//
//        // 执行插入操作
//        R<MutationResult> insertResponse = milvusClient.insert(insertParam);
//
//        if (insertResponse.getStatus() != R.Status.Success.getCode()) {
//            logger.error("Failed to insert vector: {}", insertResponse.getMessage());
//            throw new RuntimeException("Failed to insert vector: " + insertResponse.getMessage());
//        }
//    }
//
//    // 在 Milvus 中搜索与查询向量最相似的 topK 个向量，并返回对应的 user_id 列表
//    public List<Long> searchSimilarVectors(List<Float> queryVector, int topK) {
//        final String SEARCH_PARAM = "{\"nprobe\":10}"; // 搜索参数，nprobe 控制搜索精度与范围
//
//        SearchParam searchParam = SearchParam.newBuilder().withCollectionName(collectionName).withMetricType(MetricType.L2).withOutFields(Collections.singletonList("user_id")) // 返回的字段为 user_id
//                .withTopK(topK) // 返回最相似的 topK 条结果
//                .withVectors(Collections.singletonList(queryVector)) // 查询向量
//                .withVectorFieldName("vector") // 向量字段名
//                .withParams(SEARCH_PARAM).build();
//
//        // 执行搜索操作
//        R<SearchResults> searchResponse = milvusClient.search(searchParam);
//
//        if (searchResponse.getStatus() != R.Status.Success.getCode()) {
//            logger.error("Failed to search vectors: {}", searchResponse.getMessage());
//            throw new RuntimeException("Failed to search vectors: " + searchResponse.getMessage());
//        }
//
//        // 封装搜索结果
//        SearchResultsWrapper wrapper = new SearchResultsWrapper(searchResponse.getData().getResults());
//        List<Long> userIds = new ArrayList<>();
//
//        // 获取返回结果中的 user_id 字段数据（只查询了一个向量，所以取第0个）
//        List<?> fieldData = wrapper.getFieldData("user_id", 0);
//        if (fieldData != null) {
//            for (Object data : fieldData) {
//                if (data instanceof Long) {
//                    userIds.add((Long) data);
//                }
//            }
//        }
//
//        return userIds;
//    }
//
//    // 获取 Milvus 客户端对象（可用于扩展功能）
//    public MilvusServiceClient getClient() {
//        return milvusClient;
//    }
//
//    // Spring Bean 销毁前调用，关闭 Milvus 客户端连接
//    @PreDestroy
//    public void cleanup() {
//        if (milvusClient != null) {
//            milvusClient.close();
//        }
//    }
//}
